部署策略是 DevOps 實踐中的一個重要部分,它決定了如何將新版本的應用程式安全且高效地部署到生產環境中。選擇合適的部署策略可以最大限度地降低風險,減少成本,縮短停機時間,並確保新功能和修復能夠快速地交付給用戶。
選擇正確的部署策略是要依賴於我們的業務需求的,以下是一些在 DevOps 中常見的部署策略:
接下來我們來認識每種策略的特點,以及在什麼場景下面適合哪種策略。
Recreate(重建)部署策略是一種最簡單直接的部署方法。在這種策略中,所有舊版本的實例會被同時停止,然後一次性啟動所有新版本的實例。這意味著在新版本完全啟動之前,應用程序會有一段停機時間。
下圖是更新過程應用接收流量的示意圖:
Recreate 部署策略雖然簡單,但因其停機時間和風險較高,通常只適用於特定情況下的快速部署。
要在 Kubernetes 使用此策略,我們可以在 Deployment
資源中定義 spec.strategy.type
為 Recreate
,使用該策略進行部署。
spec:
replicas: 3
strategy:
type: Recreate
Rolling Update(滾動更新)又被稱為 Ramped
,是一種逐步替換應用程序舊版本實例為新版本實例的部署策略。與 Recreate 不同的是,滾動更新不會同時停止所有舊版本實例,而是分批次地進行替換,直到所有實例都被替換完成為止,這樣可以減少或避免應用程序的停機時間。
下圖是更新過程應用接收流量的示意圖:
滾動更新是一種在保證應用程序高可用性的前提下,逐步進行版本更新的策略,適合需要連續運行且無法承受長時間停機的應用程序。
要在 Kubernetes 使用此策略,可以在 Deployment
資源中定義 spec.strategy.type
為 RollingUpdate
,然後定義關鍵參數:
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2 # 一次可以新增多少個Pod
maxUnavailable: 1 # 滾動更新期間最大多少個Pod不可用
Blue-Green Deployment(藍綠部署)也被稱為紅/黑部署
,是一種用於減少停機時間並降低部署風險的部署策略。這種策略通過同時運行兩個環境(藍色和綠色)來實現無縫的版本切換。
下圖是更新過程應用接收流量的示意圖:
藍綠部署策略通過雙環境運行和快速切換流量,有效降低了新版本部署的風險,適合需要高可用性和穩定性的應用程序。
在 Kubernetes 中,我們可以用兩種方法來實現藍綠部署,通過單個 Service 對象或者 Ingress 控製器來實現藍綠部署,實際操作都是類似的,都是通過 label 標籤去控制。
同時部署新版本(綠
) 與舊版本(藍
) ,在新版本通過測試後,然後才更新 Kubernetes 中扮演負載平衡器角色的 Service 對象,通過替換 label selector 中的版本標籤來將流量傳送到新版本。
Canary Deployment(金絲雀部署)是一種漸進式的部署策略,通過將新版本先部署到少量伺服器上,然後根據實際效果逐步擴大部署範圍,以控制風險和驗證新版本的穩定性。
金絲雀部署是讓部分使用者訪問到新版本應用,
下圖是更新過程應用接收流量的示意圖:
金絲雀部署策略通過漸進式的部署方式,有效降低了新版本上線的風險,適合需要高可靠性和逐步驗證的應用程序。
在 Kubernetes 中,可以使用兩個具有相同 Pod 標籤的 Deployment 來實現金絲雀部署。新版本的副本和舊版本的一起發佈。在一段時間後如果沒有檢測到錯誤,則可以擴展新版本的副本數量並刪除舊版本的應用。
如果需要按照具體的百分比來進行金絲雀發佈,需要儘可能的啟動多的 Pod 副本,這樣計算流量百分比的時候才方便。比如,如果你想將 1% 的流量傳送到版本 B,那麼我們就需要有一個運行版本 B 的 Pod 和 99 個運行版本 A 的 Pod,當然如果你對具體的控制策略不在意的話也就無所謂了,如果你需要更精確的控制策略,建議使用服務網格(如 Istio),它們可以更好地控制流量。
A/B Testing (A/B 測試)部署策略是一種通過同時運行兩個或多個版本應用,透過如地理位置、Header、Cookie、User Agent、語言等條件,來決定使用者將要訪問的應用版本。來測試和比較其效果的部署方法。這種策略通常用於優化產品性能、用戶體驗和業務指標,是一種基於統計數據而不是部署策略來製定業務決策的技術。然而,它是相關的,並且可以透過向金絲雀部署添加額外的功能來實現。
下圖是更新過程應用接收流量的示意圖:
在 Kubernetes 中並不原生支援,需要額外的一些高級元件來完成改設定(比如 Istio、Linkerd、Traefik、或者自訂 Nginx/Haproxy 等)
要使用這些細粒度的控制,仍然還是建議使用 Istio ,可以根據權重或 HTTP 頭等來動態請求路由控制流量轉發。
Shadow Deployment(影子部署)是一種部署策略,允許在不影響實際生產流量的情況下,將生產環境中的流量複製到新版本應用程序中,以進行真實環境下的測試。這種方法能夠在不影響用戶體驗的前提下,驗證新版本的性能和功能。
下圖是更新過程應用接收流量的示意圖:
該技術的設置相當複雜,並且需要特殊要求,特別是對於出口流量。例如,對於一個電商平台,如果您想對支付服務進行影子測試,最終可能會導致客戶為其訂單支付兩次費用。在這種情況下,您可以透過建立複製來自提供者的回應的模擬服務來解決這個問題。
根據上述策略的特性以及優缺點,我們可以簡單的為應用場景對應的策略做個結論:
recreate
或 rolling update
是節省成本和麻煩的理想選擇。rolling update
或 blue/green
適合一般,但新版本的提前測試非常重要。blue/green
最為合適。canary
可將使用者影響降至最低。A/B testing
他就是為這個情境而生。